package com.mjf.sparsearray;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;

/**
 * 二维数据转稀疏数组
 *
 * 1. 创建一个N行(非空元素个数+1) 3列的稀疏数组
 * 2. 给稀疏数组赋值
 * 		1). 第一行：[二维数据包含的一维数据个数, 一维数组的元素个数, 非空元素个数]
 * 		2). 遍历二维数组，将第i个非空元素存入稀疏数组第i行 [非空元素所在行数, 非空元素所在列数, 非空元素值]
 */
public class SparseArray {
	
	public static void main(String[] args) throws IOException {
		
		// 创建一个原始的二维数组 11 * 11
		// 0：表示没有棋子	1：表示黑子	2：表示白子
		int[][] chessArr1 = new int[11][11];
		chessArr1[1][2] = 1;
		chessArr1[2][3] = 2;
		chessArr1[4][5] = 2;
		
		// 输出原始二维数组
		print(chessArr1, "原始二维数组");
		
		// 将二维数组转稀疏数组
		// 1.先遍历二维数组，得到非0数据的个数
		int sum = 0;
		for (int[] value : chessArr1) {
			for (int i : value) {
				if (i != 0) {
					sum++;
				}
			}
		}
		
		// 2.创建对应的稀疏数组
		int[][] sparseArr = new int[sum+1][3];
		// 给稀疏数组赋值
		sparseArr[0][0] = chessArr1.length;
		sparseArr[0][1] = chessArr1[0].length;
		sparseArr[0][2] = sum;
		
		// 遍历二维数组，将非0的值存放到sparseArr中
		int count = 0; // count 用来记录是第几个非0数据
		for (int i = 0; i < chessArr1.length; i++) {
			for (int j = 0; j < chessArr1[i].length; j++) {
				if (chessArr1[i][j] != 0) {
					count ++;
					sparseArr[count][0] = i;
					sparseArr[count][1] = j;
					sparseArr[count][2] = chessArr1[i][j];
				}
			}
		}
		
		// 输出稀疏数组
		print(sparseArr, "得到的稀疏数组");
		
		// 将稀疏数组保存到文件data.map中
		FileWriter fw = new FileWriter("D:\\coding\\idea\\DataStructures\\output\\data.map");
		for (int[] ints : sparseArr) {
			fw.write(Arrays.toString(ints).replace("[", "").replace("]", "").replace(" ", "").concat("\n"));
		}
		fw.flush();
		fw.close();
		
		// 从文件data.map中读取稀疏数组
		FileReader fr = new FileReader("D:\\coding\\idea\\DataStructures\\output\\data.map");
		BufferedReader br = new BufferedReader(fr);
		String line;
		ArrayList<String> strList = new ArrayList<String>();
		while ((line = br.readLine()) != null) {
			strList.add(line);
		}
		
		int[][] sparseArr2 = new int[strList.size()][3];
		for (int i = 0; i < strList.size(); i++) {
			sparseArr2[i][0] = Integer.parseInt(strList.get(i).split(",")[0]);
			sparseArr2[i][1] = Integer.parseInt(strList.get(i).split(",")[1]);
			sparseArr2[i][2] = Integer.parseInt(strList.get(i).split(",")[2]);
		}
		
		br.close();
		fr.close();
		
		print(sparseArr2, "文件读取出来的稀疏数组");
		
		
		// 将稀疏数组恢复为原始的二维数组
		int[][] chessArr2 = new int[sparseArr[0][0]] [sparseArr[0][1]];
		for (int i = 1; i < sparseArr.length; i++) {
				chessArr2[sparseArr[i][0]] [sparseArr[i][1]] = sparseArr[i][2];
		}
		
		// 输出恢复后的二维数组
		print(chessArr2, "恢复后的二维数组");
		
	}
	
	/**
	 * 打印二维数组
	 * @param arr 要打印的数组
	 * @param describe 数组描述
	 */
	public static void print(int[][] arr, String describe) {
		
		System.out.printf("============打印：%s============%n", describe);
		
		for (int[] row : arr) {
			for (int data : row) {
				System.out.printf("%d\t", data);
			}
			System.out.println();
		}
		
	}

}
